package pers.mine.utils;

import java.util.ArrayList;
import java.util.List;

/**
 * String 工具类
 * 
 * @author Mine
 * @since 2017年4月21日_下午9:21:12
 */
public class MineStringUtils {

	/**
	 * 判断字符串是否是null 或者 "" ,满足一项返回true,反之false
	 * 
	 * @param str
	 * @return 验证结果
	 */
	public static boolean IsNullOrEmpty(String str) {
		if (str == null) {
			return true;
		}
		if ("".equals(str)) {
			return true;
		}
		return false;
	}

	/**
	 * 判断字符串是否是null 或者 "" 或者 全空格 ,满足一项返回true,反之false
	 * 
	 * @param str
	 * @return 验证结果
	 */
	public static boolean IsNullOrWhiteSpace(String str) {
		if (str == null) {
			return true;
		}
		if ("".equals(str.trim())) {
			return true;
		}
		return false;
	}

	/**
	 * 判断字符串之中是否是存在空格,满足返回true,反之false
	 * 
	 * @param str
	 * @return 验证结果
	 */
	public static boolean hasSpace(String str) {
		if (str == null) {
			return false;
		}
		if (str.indexOf(" ") != -1) {
			return true;
		}
		return false;
	}

	/**
	 * 判断字符串长度是否合法,包含边界值
	 * 
	 * @param str
	 * @param minLength
	 * @param maxLength
	 * @return 验证结果
	 */
	public static boolean lengthIsBetween(String str, Integer minLength,
			Integer maxLength) {
		if (str == null) {
			return true;
		}
		int length = str.length();
		if (minLength != null && maxLength != null) {
			if (minLength < 0 || minLength >= maxLength) {
				throw new RuntimeException("长度判断参数非法!");
			}
			if (length >= minLength && length <= maxLength) {
				return true;
			}
		} else if (minLength != null && maxLength == null) {
			if (length >= minLength) {
				return true;
			}
		} else if (minLength == null && maxLength != null) {
			if (length <= maxLength) {
				return true;
			}
		} else {
			throw new RuntimeException("长度判断参数非法!");
		}
		return false;
	}

	/**
	 * 判断字符串之中是否是存在【字符串数组】中某一项,满足返回true,反之false,keys为null或长度为0返回false
	 * 
	 * @param str
	 * @param keys
	 * @return 验证结果
	 */
	public static boolean hasKey(String str, String[] keys) {
		if (str == null) {
			return true;
		}
		if (keys == null || keys.length < 1) {
			return false;
		}
		for (String key : keys) {
			if (str.indexOf(key) != -1) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 判断字符串之中是否是存在字符串,满足返回true,反之false,keys为nul返回false
	 * 
	 * @param str
	 * @param key
	 * @return 验证结果
	 */
	public static boolean hasKey(String str, String key) {
		if (str == null) {
			return true;
		}
		if (MineStringUtils.IsNullOrEmpty(str)) {
			return false;
		}
		if (str.indexOf(key) != -1) {
			return true;
		}
		return false;
	}

	/**
	 * 简单去前后空格,防空指针异常
	 * 
	 * @param str
	 * @return 去除后字符串
	 */
	public static String trim(String str) {
		if (str != null) {
			str = str.trim();
		}
		return str;
	}

	/**
	 * 判断字符串是否存在于字符串数组中，区分大小写，存在返回true，反之false; key字符串为null返回false
	 * 
	 * @param str
	 *            key字符串
	 * @param strArr
	 *            查询字符串数组
	 * @return 验证结果
	 */
	public static boolean strIsInStrArr(String str, String[] strArr) {
		if (str == null) {
			return false;
		}
		for (String one : strArr) {
			if (str.equals(one)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 判断字符串是否存在于字符串数组中,不区分大小写，存在返回true，反之false; key字符串为null返回false
	 * 
	 * @param str
	 *            key字符串
	 * @param strArr
	 *            查询字符串数组
	 * @return 验证结果
	 */
	public static boolean strIsInStrArrIgnoreCase(String str, String[] strArr) {
		if (str == null) {
			return false;
		}
		for (String one : strArr) {
			if (str.equalsIgnoreCase(one)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 获取一个句子的关键字
	 * 
	 * @param str
	 *            源句子
	 * @param keylength
	 *            关键字长度
	 * @return
	 */
	public static List<String> getSimpleKeys(String str, int keylength) {
		if (MineStringUtils.IsNullOrWhiteSpace(str)) {
			return null;
		}
		if (keylength < 1) {
			return null;
		}
		str = str.replaceAll("\\s*", "");
		int length = str.length();
		
		List<String> target = new ArrayList<String>();
		if (keylength >= length) {
			target.add(str);
		}else{
			for (int i = 0; i <=(length - keylength); i++) {
				target.add(str.substring(i, i + keylength));
			}	
		}
		return target;

	}

	/**
	 * 格式化时间长度
	 * @param duration
	 * @return
	 */
	public static String formatTimeStr(double duration) {
		int one = (int) (duration / 1000);
		int h = one / (60 * 60);
		int two = one % (60 * 60);
		int m = two / 60;
		int s = two % 60;
		return h + ":" + (m < 10 ? "0" + m : m) + ":" + (s < 10 ? "0" + s : s);
	}
}
